# -*- coding: utf-8 -*-
import numpy as np
import cv2
from matplotlib import pyplot as plt

def cv_show(img, name, writename):  #
    cv2.imshow(name, img)
    cv2.imwrite(writename, img)
    cv2.waitKey()
    cv2.destroyAllWindows()
# 模板匹配：使用模板在图像中查找目标，找到原图中模板的坐标，根据模板的大小可以框出原图中模板位置
# cv2.matchTemplate()， cv2.minMaxLoc()
# cv2.minMaxLoc()找到图像中的最小值和最大值的位置；返回值1：矩形左上角的位置（xy点坐标），2：模板的宽和高
# matchTemplate(img,template,method):
# 参数img:待搜索的图像(大图)
# 参数temple:搜索模板,需要和原图一样的数据类型且尺寸不能大于源图像
# 参数method:指定匹配方法,有如下几种:
#     CV_TM_CCOEFF:系数匹配法
#     CV_TM_CCOEFF_NORMED:化相关系数匹配法
#     CV_TM_CCORR:相关匹配法
#     CV_TM_CCORR_NORMED:归一化相关匹配法
#     CV_TM_SQDIFF:平方差匹配法
#     CV_TM_SQDIFF_NORMED:归一化平方差匹配法

# 读取原始图像
img = cv2.imread('lena.jpg ',0)
# 读取模板图像
template = cv2.imread('modle.png',0)
# 获取模板高h和长w
h = template.shape[0]
w = template.shape[1]
methods = ['cv2.TM_CCOEFF','cv2.TM_CCOEFF_NORMED','cv2.TM_CCORR','cv2.TM_CCORR_NORMED','cv2.TM_SQDIFF','cv2.TM_SQDIFF_NORMED']
png = '.png'

for meth in methods:
    #复制原图
    img2 = img.copy()
    #匹配方法的真值
    method = eval(meth)
    #模板匹配方法设置
    res = cv2.matchTemplate(img, template, method)
    # 获取图像中最小值和最大值的位置
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

    #如果是平方差匹配cv2.TM_SQDIFF或归一化平方差匹配到cv2.TM_SQDIFF_NORMED,取最小值
    if method in [cv2.TM_SQDIFF,cv2.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc
    bottom_right = (top_left[0] +w,top_left[1]+h)
    # 在原图中画模板位置矩形
    cv2.rectangle(img2,top_left,bottom_right,255,2)
    #每张图的保存名称
    endname = meth + png
    plt.subplot(121),plt.imshow(res,cmap='gray')
    plt.xticks([]),plt.yticks([])
    plt.subplot(122),plt.imshow(img2, cmap='gray')
    plt.xticks([]),plt.yticks([])
    plt.suptitle(meth)
    #保存每张图
    plt.savefig(endname)
    plt.show()

